package edu.jptest.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class MailUtil {

	String fromMail = "zl_stone_0608@qq.com";
	String hostServer = "smtp.qq.com";
	String password = "ssdutjpsite";
	String user = "zl_stone_0608";

	// 向注册用户发送验证链接地址—，
	// 参数——目的邮箱，密码，验证码
	public void validate(String toEmail, String password, String validateCode)
			throws Exception {
		try {
			String subject = "日语在线考试用户注册成功---日语学习在线我们自己的日语学习交流网站";
			String content1 = "<html><body><h2>欢迎注册日语在线网站</h2>"
					+ "<p>您的账号已经成功创建，请与今晚24：00前点击此链接激活账号进行验证：</p><br />"
					+ FinalConstants.BASEPATH + "activation.action?email=";
			String content2 = "&validateCode=";
			String content3 = "<br><br>如果链接无法点击，请复制到浏览器地址栏中进行激活。<br><br><br><p>请妥善保留这封电子邮件. 您的帐号资料如下:</p><br>"
					+ "----------------------------<br>"
					+ "邮箱: "
					+ toEmail
					+ "<br>密码: "
					+ password
					+ "<br>----------------------------<br>"
					+

					"请牢记您的密码， 因为密码经过了加密处理， 管理员也无法取得。 如果您忘记了密码，可以在用户登录界面通过“找回密码”的链接，重置你的密码。<br>"
					+ "注意：<br>"
					+ "1、在您使用日语在线考试网站之前，务必仔细阅读日语在线考试网站使用规则，并且严格遵守，避免发生不必要的误会。<br>"
					+ "2、您有任何问题，可以写信给管理员"
					+ FinalConstants.ManagerEmail
					+ "，寻求帮助。<br>"
					+ "3、进入日语学习在线首页："
					+ FinalConstants.HOMEPATH
					+ "<br>"
					+ "日语在线考试 和您一同成长，感谢您的注册！<br><br>日语在线考试网站小组<br><br>日语学习在线----我们自己的日语学习交流网站！<br>";
			System.out.println(content1 + toEmail + content2 + validateCode);////////////////////
			//send(toEmail, subject, content1 + toEmail + content2 + validateCode
			//		+ content3);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("发送验证邮件错误!");
		}
	}

	// 向用户发送密码更改通知，
	// 参数——目的邮箱，密码
	public void passwordConfirm(String toEmail, String password)
			throws Exception {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
			String subject = "日语在线考试用户密码更改通知---日语学习在线我们自己的日语学习交流网站";
			String content1 = "<html><body><h2>日语在线考试网站</h2>" + "<p>" + toEmail
					+ "用户您好，您的密码已在" + sdf.format(new Date()) + "被更改。</p><br />";
			String content2 = "这是密码更改通知邮件";
			String content3 = "<br><br><br><p>请妥善保留这封电子邮件. 您的帐号资料如下:</p><br>"
					+ "----------------------------<br>"
					+ "邮箱: "
					+ toEmail
					+ "<br>密码: "
					+ password
					+ "<br>----------------------------<br>"
					+

					"请牢记您的密码， 因为密码经过了加密处理， 管理员也无法取得。 如果您忘记了密码，可以在用户登录界面通过“找回密码”的链接，重置你的密码。<br>"
					+ "如果您有任何问题，可以写信给管理员"
					+ FinalConstants.ManagerEmail
					+ "，寻求帮助。<br>"
					+ "<br><br>进入日语学习在线首页："
					+ FinalConstants.HOMEPATH
					+ "<br>"
					+ "日语在线考试 和您一同成长！<br><br>日语在线考试网站小组<br><br>日语学习在线----我们自己的日语学习交流网站！<br>";
			send(toEmail, subject, content1 + content2 + content3);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("发送验证邮件错误!");
		}
	}

	// 密码丢失后确认邮箱 发送连接激活重置密码
	// 向用户发送密码丢失确认通知，
	// 参数——目的邮箱，激活码
	public void lostEmailConfirm(String toEmail, String validateCode)
			throws Exception {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
			String subject = "日语在线考试密码丢失确认函---日语学习在线我们自己的日语学习交流网站";
			String content1 = "<html><body><h2>日语在线考试网站</h2>" + "<p>" + toEmail
					+ "用户您好，您在" + sdf.format(new Date())
					+ "使用了找回密码功能。</p><br />";
			String content2 = "这是密码丢失确认邮件<br>如果您的密码已确信丢失，点击以下链接，系统将立即返回您一封邮件，内含随机生成6位字符作为您的新密码。";
			String content3 = "<br><br><br><p>请妥善保留这封电子邮件. 您的帐号资料如下:</p><br>"
					+ "----------------------------<br>"
					+ FinalConstants.BASEPATH
					+ "lostPassActivation.action?email="
					+ toEmail
					+ "&validateCode="
					+ validateCode
					+ "<br>----------------------------<br><br><br>如果链接无法点击，请复制到浏览器地址栏中进行激活。<br><br>"

					+ "如果您有任何问题，可以写信给管理员"
					+ FinalConstants.ManagerEmail
					+ "，寻求帮助。<br>"
					+ "<br><br>进入日语学习在线首页："
					+ FinalConstants.HOMEPATH
					+ "<br>"
					+ "日语在线考试 和您一同成长！<br><br>日语在线考试网站小组<br><br>日语学习在线----我们自己的日语学习交流网站！<br>";
			send(toEmail, subject, content1 + content2 + content3);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("发送验证邮件错误!");
		}
	}

	// 密码丢失后向用户发送密码重置通知，
	// 参数——目的邮箱，密码
	public void lostPasswordNotify(String toEmail, String password)
			throws Exception {
		try {
			String subject = "日语在线考试找回密码通知---日语学习在线我们自己的日语学习交流网站";
			String content1 = "<html><body><h2>日语在线考试网站</h2>" + "<p>" + toEmail
					+ "用户您好，你的密码已被随机重置。</p><br />";
			String content2 = "这是密码更改通知邮件";
			String content3 = "<br><br><br><p>请妥善保留这封电子邮件. 您的帐号资料如下:</p><br>"
					+ "----------------------------<br>"
					+ "邮箱: "
					+ toEmail
					+ "<br>密码: "
					+ password
					+ "<br>----------------------------<br>"
					+

					"请牢记您的密码， 因为密码经过了加密处理， 管理员也无法取得。 如果您忘记了密码，可以在用户登录界面通过“找回密码”的链接，重置你的密码。<br>"
					+ "如果您有任何问题，可以写信给管理员"
					+ FinalConstants.ManagerEmail
					+ "，寻求帮助。<br>"
					+ "<br><br>进入日语学习在线首页："
					+ FinalConstants.HOMEPATH
					+ "<br>"
					+ "日语在线考试 和您一同成长！<br><br>日语在线考试网站小组<br><br>日语学习在线----我们自己的日语学习交流网站！<br>";
			send(toEmail, subject, content1 + content2 + content3);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("发送验证邮件错误!");
		}
	}

	// 发送邮件主函数,参数——目的邮箱，邮件主题、邮件内容
	public void send(String toEmail, String toSubject, String toContent)
			throws Exception {

		try {
			// Properties 类表示了一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。
			Properties props = System.getProperties();
			props.put("mail.smtp.host", hostServer);
			props.put("mail.smtp.auth", "true");
			props.put("mail.transpost.protocol", "smtp");
			props.put("mail.smtp.port ", "25");

			/*
			 * Session 类定义了一个基本邮件会话(session)，是Java MailAPI最高层入口类。
			 * 所有其它类都是经由这个session 才得以生效。 Session 对象用Java.util.Properties
			 * 对象获取信息，如邮件服务器、用户名、密码及整个应用程序中共享的其它信息。
			 */
			//AuthMail auth = new AuthMail(user, password);
			Session session = Session.getInstance(props);
			session.setDebug(true);

			// Address 也是个抽象类,一般用的是 Javax.mail.internet.InternetAddress 类
			Address fromAddress = new InternetAddress(fromMail);
			Address toAddress = new InternetAddress(toEmail);

			/*
			 * Javax.mail.Message：一旦获得 Session 对象，就可以继续创建要发送的消息。 这由
			 * Message类来完成。因为 Message
			 * 是个抽象类，必需用一个子类，多数情况下为Javax.mail.internet.MimeMessage。 MimeMessage
			 * 是个能理解 MIME类型和头的电子邮件消息，正如不同 RFC 中所定义的。 虽然在某些头部域非 ASCII 字符也能被译码，但
			 * Message头只能被限制为用 US-ASCII 字符。
			 */
			Message message = new MimeMessage(session);

			// 设置邮件
			message.setFrom(fromAddress);
			message.setRecipient(Message.RecipientType.TO, toAddress);
			message.setSubject(toSubject);
			message.setSentDate(new Date());

			// 设置消息对象的内容
			BodyPart mdp = new MimeBodyPart();// 新建存放信件内容的BodyPart对象
			mdp.setContent(toContent, "text/html;charset=utf8");// 设置内容，编码格式
			Multipart mm = new MimeMultipart();// 新建Multipart对象存放BodyPa让他对象
			mm.addBodyPart(mdp);
			message.setContent(mm);// 把mm最为消息对象内容
			message.saveChanges();// 保存

			// 用协议指定的语言发送消息（通常是 SMTP）
			Transport transport = session.getTransport("smtp");

			transport.connect(hostServer, user, password);
			transport.sendMessage(message, message.getAllRecipients());
			transport.close();
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("发送邮件错误");
		}
	}
}
